package com.principles.structure.proxy;

/**
 * @Description  代理模式————为其他对象提供一种代理以控制对这个对象的访问。
 * 装饰器模式 是加功能，在原来的对象上添加方法
 * 代理模式 是增强原来功能，在原来执行的方法之前或者之后执行其他功能
 * @Date 2025/1/27 22:16
 **/
public class ProxyPattern {
    public static void main(String[] args) {
        // 这两个都可以
        new RealSubjectProxy(new RealSubject()).work();
        // 这个也可以
        new RealSubjectProxy().work();
    }
}

interface Subject{
    void work();
}

class RealSubject implements Subject{

    @Override
    public void work() {
        System.out.println("开始工作");
    }
}

class RealSubjectProxy implements Subject{

    private RealSubject subject;

    public RealSubjectProxy(RealSubject subject) {
        this.subject = subject;
    }

    public RealSubjectProxy() {
        try {
            this.subject = (RealSubject) this.getClass().getClassLoader().loadClass("com.principles.structure.proxy.RealSubject").newInstance();
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }

    private void before(){
        System.out.println("方法执行之前");
    }

    @Override
    public void work() {
        before();
        subject.work();
        after();
    }

    private void after(){
        System.out.println("方法执行之后");
    }
}